package main

import (
	"context"
	"fmt"
	"sync"
	"time"
)

/*
 */
var wg12 sync.WaitGroup

// 采用context.Context类型作为入参
func cpuInfo12(ctx context.Context) {
	defer wg12.Done()
	//.Value("键")获取context.WithValue传入的值
	fmt.Printf("请求id:%s\n\r", ctx.Value("traceid"))
	for {
		select {
		// context.Context中的Done()方法是个channel，等待外部调用就发送值，这里接收值，从而达到控制的作用
		case <-ctx.Done():
			fmt.Println("退出cpu监控")
			return
		default:
			fmt.Println("获取cpu信息")
			time.Sleep(time.Second * 1)
		}
	}

}

func main() {
	/*
		二、context.WithTimeout实现超时，自动取消
	*/
	wg12.Add(1)
	// context.Background()创建父的context，WithTimeout设置时间自动给Done()发消息，不在需要通过函数调用发送消息
	ctx3, _ := context.WithTimeout(context.Background(), time.Second*3)

	/*
		三、	context.WithDeadline()在某个时间点自动发送消息
	*/
	//这里不在这里将

	/*
		四、context.WithValue()  用于主动传值
		使用场景： 链路追踪，某个id从头传到尾
	*/
	//定义一个子的context，并传值，值的定义是key-value的格式，并且是基于ctx3创建的，继承了ctx3的特性，超时控制
	//配合ctx.Value("键名")
	ctx4 := context.WithValue(ctx3, "traceid", "jgin123")

	//传入子的context可以正常取消
	cpuInfo12(ctx4)
	wg12.Wait()

}
